home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / smaltalk / manchest.lha / MANCHESTER / usenet / st80_pre4 / DisplayIfWhile.st < prev    next >
Text File  |  1993-07-24  |  8KB  |  213 lines

  1. "    NAME        DisplayIfWhile
  2.     AUTHOR        pieter@prls.UUCP (Pieter van der Meulen)
  3.     FUNCTION    Display message while something else is going on
  4.     ST-VERSION    2.3 2.4 2.5
  5.     PREREQUISITES    
  6.     CONFLICTS
  7.     DISTRIBUTION    world
  8.     VERSION        1
  9.     DATE    11 Jul 1990
  10. SUMMARY Suppose you are filing in your application, and you want to display a
  11. PLEASE WAIT message only if the mouse buttons are pressed, neither
  12. <aCursor showWhile: [...]> nor <aForm follow: [....] while: [...]>
  13. are what you want. These sources show you how to do this, i.e.
  14. conditionally displaying a DisplayObject.
  15. "!
  16.  
  17. "
  18. From: pieter@prls.UUCP (Pieter van der Meulen)
  19. Newsgroups: comp.lang.smalltalk
  20. Subject: GOODIE - DisplayIfWhile.st
  21. Keywords: DisplayObject display if while FileList
  22. Message-ID: <40940@prls.UUCP>
  23. Date: 11 Jul 90 00:47:11 GMT
  24. Organization: Philips R&D Center, Sunnyvale, CA
  25.  
  26. It has been a while since the last goodie posting, and I noticed
  27. some discussions on the (limitations of) Smalltalk processes.
  28. Here is a goodie which gives you an idea of what you can and should
  29. (not) do with Smalltalk processes. You use it to show a message if
  30. users get impatient while Smalltalk is busily computing (at fileIn maybe ? :-)
  31.  
  32. Have fun, Pieter.
  33.  
  34. P.S. van der Meulen, MS 02        prls!!pieter
  35. PRLS, Signetics div. of NAPC      -----------
  36. 811 E.Arques Avenue, Sunnyvale, CA 94088-3409
  37.  
  38.  
  39. "
  40. 'Suppose you are filing in your application, and you want to display a
  41. PLEASE WAIT message only if the mouse buttons are pressed, neither
  42. <aCursor showWhile: [...]> nor <aForm follow: [....] while: [...]>
  43. are what you want. These sources show you how to do this, i.e.
  44. conditionally displaying a DisplayObject.
  45.  
  46. The basic and a derivative display methods for DisplayObject are given.
  47. Other display methods like the ones in the DisplayObject>displaying
  48. protocol can easily be constructed using the basic display primitive.
  49.  
  50. As an example, the <fileIn> method for FileModel is included. The code works
  51. for both Smalltalk version 2.3 and (2.4) 2.5. A <fileIn> initiated from a
  52. FileList will display a PLEASE WAIT message if the user pressed a key or
  53. mouse button. Note that any KEYS pressed will NOT be flushed.
  54. Also, try the examples included in the comment of each display method.
  55.  
  56.     Copyright (C) 1990, Pieter S. van der Meulen.
  57.     This program is placed in the public domain.
  58.     You may use and alter this program freely
  59.     for non-commercial purposes as long as you
  60.     leave this message intact.  Neither I nor
  61.     my company will recognize any responsibility
  62.     for damages arising from use of this program.'!
  63.  
  64. !DisplayObject methodsFor: 'conditional displaying'!
  65.  
  66. displayForSeconds: secInteger if: testBlock while: evalBlock
  67.     "This is a simple method for conditional display of objects while
  68.     evaluating evalBlock. The value of evalBlock is returned.
  69.     The evalBlock is expected to take some time to execute.
  70.     If the testBlock evaluates to true during this execution, the
  71.     receiver will be displayed. The duration of this display is
  72.     determined by secInteger. If the latter is equal to zero, display
  73.     will continue until evalBlock is finished.
  74.  
  75.     In the example below, the evaluation of evalBlock creates a new
  76.     active process, which causes an abnormal termination of this method,
  77.     but gives you a good impression how it all works."
  78.  
  79.     "' Still browsing. Please wait. ' asDisplayText form reverse
  80.         displayForSeconds: 2
  81.         if: [Sensor anythingPressed]
  82.         while: [Smalltalk browseAllCallsOn: #at: and: #at:put:]"
  83.  
  84.     ^self displayOn: Display
  85.         at: [Sensor cursorPoint]
  86.         clippingBox: Display boundingBox
  87.         rule: Form over
  88.         mask: nil
  89.         forSeconds: secInteger
  90.         if: testBlock
  91.         while: evalBlock!
  92.  
  93. displayOn: aDisplayMedium at: pointOrBlock clippingBox: aRect rule: ruleInteger
  94. mask: aForm forSeconds: secInteger if: testBlock while: evalBlock
  95.     "This is the basic display primitive for conditional display of objects
  96.     while evaluating evalBlock. The value of evalBlock is returned.
  97.     The evalBlock is expected to take some time to execute. If the testBlock
  98.     evaluates to true during this execution, the receiver will be displayed.
  99.     The duration of this display is determined by secInteger. If the latter
  100.     is equal to zero, display will continue until evalBlock is finished.
  101.     The location for display is determined by pointOrBlock, which may be a
  102.     Point or a block which evaluates to aPoint.
  103.     If pointOrBlock would be [Sensor cursorPoint] and testBlock [true], this
  104.     method will behave like a 1-second-update-<follow:while:> method.
  105.     If the evaluation of evalBlock creates a new active process, e.g.
  106.     opening an Inspector, the receiver may not be able to erase itself from
  107.     aDisplayMedium. To cover ST-versions, 3 termination tricks are used.
  108.     The process associated with displaying the receiver needs to run at
  109.     userInterruptPriority, because the system code implemeting the <fileIn>
  110.     never issues a <Processor yield>. (C) 1990, Pieter S. van der Meulen."
  111.  
  112.     "Cursor crossHair showWhile:
  113.         [' Showing cursor location in top left corner.
  114.  Hold SHIFT key for 1 second to terminate.'
  115.             asDisplayText form reverse
  116.                 displayOn: Display
  117.                 at: [Sensor cursorPoint]
  118.                 clippingBox: Display boundingBox
  119.                 rule: Form over
  120.                 mask: nil
  121.                 forSeconds: 2
  122.                 if: [Sensor anythingPressed]
  123.                 while: [[Sensor leftShiftDown] whileFalse:
  124.                     [(Sensor cursorPoint printString,'    ')
  125.                         asDisplayText displayAt: 0@0]].
  126.         Sensor flushKeyboard]"
  127.  
  128.     | oldP newP seconds showProcess showing value bgForm thisProcess |
  129.     seconds _ 0.
  130.     showing _ true.
  131.     thisProcess _ Processor activeProcess.
  132.     showProcess _ [
  133.         [(Delay forMilliseconds: 1000) wait.
  134.         (testBlock isNil or: [thisProcess suspendingList isNil])
  135.             ifTrue: [showing _ nil]        "Unexpected termination"
  136.             ifFalse:
  137.                 [testBlock value
  138.                     ifTrue:
  139.                         [seconds _ secInteger.
  140.                         (pointOrBlock isKindOf: Point)
  141.                             ifTrue: [oldP _ pointOrBlock]
  142.                             ifFalse:    "Trace without flashing"
  143.                                 [newP _ pointOrBlock value.
  144.                                 (oldP ~= newP and: [bgForm notNil])
  145.                                     ifTrue: [bgForm display. bgForm _ nil].
  146.                                 oldP _ newP].
  147.                         bgForm isNil
  148.                             ifTrue:
  149.                                 [aDisplayMedium = Display
  150.                                     ifTrue: [bgForm _ self backgroundAt:
  151.                                                 oldP + self offset].
  152.                                 self displayOn: aDisplayMedium
  153.                                     at: oldP
  154.                                     clippingBox: aRect
  155.                                     rule: ruleInteger
  156.                                     mask: aForm]].
  157.                 seconds > 0
  158.                     ifTrue:
  159.                         [seconds _ seconds - 1.
  160.                         seconds = 0
  161.                             ifTrue:
  162.                                 [bgForm display. bgForm _ nil]]].
  163.         showing notNil] whileTrue.
  164.         bgForm notNil ifTrue: [bgForm display]] newProcess.
  165.     showProcess priority: Processor userInterruptPriority.
  166.     showProcess resume.
  167.     value _ evalBlock value.
  168.     showing _ nil.    "Proper termination of the showProcess."
  169.     [showProcess suspendingList isNil] whileFalse.
  170.     bgForm notNil ifTrue: [bgForm display].
  171.     ^value! !
  172.  
  173.  
  174. !InputSensor methodsFor: 'mouse'!
  175.  
  176. anythingPressed
  177.     "Answer whether anything is being pressed."
  178.  
  179.     ^self anyButtonPressed or:
  180.     [self keyboardPressed or:
  181.     [self leftShiftDown or:
  182.     [self ctrlDown]]]! !
  183.  
  184.  
  185. !FileModel methodsFor: 'user protocol'!
  186.  
  187. fileInFile
  188.     "Read the entire file as Smalltalk code.
  189.     Display a PLEASE WAIT message if the user pressed a key or mouse button.
  190.     This methods supports both Smalltalk version 2.3 and (2.4) 2.5.
  191.     To simplify, take out that part which does not relate to your version."
  192.  
  193.     | aForm |
  194.     aForm _ ('Please wait. Still reading ',fileName) asDisplayText form.
  195.     ^((Form new extent: aForm extent + (8@8)) black
  196.         copyBits: (0@0 extent: aForm extent)
  197.         from: aForm
  198.         at: (4@4)
  199.         clippingBox: (0@0 extent: aForm extent + (8@8))
  200.         rule: Form over
  201.         mask: Form black)
  202.             displayOn: Display
  203.             at: [Sensor cursorPoint]
  204.             clippingBox: Display boundingBox
  205.             rule: Form over
  206.             mask: nil
  207.             forSeconds: 3
  208.             if: [Sensor anythingPressed]
  209.             while: [('*2.5*' match: Smalltalk version)
  210.                 ifTrue: [(Filename named: fileName) fileIn]
  211.                 ifFalse: [(FileStream oldFileNamed: fileName) fileIn]]! !
  212.  
  213.